﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using FastFood.Business.Entities;
using FastFood.Business.Entities.Tipos;
using FastFood.Business.Logic;
using FastFood.Windows.Helpers;

namespace FastFood.Windows.Forms.Procesos
{
    public partial class CwfCocina : UserControl
    {
        private EstadoActual estadoActual;
        private readonly CwfSemiTerminadoBusqueda buscador = new CwfSemiTerminadoBusqueda();

        public CwfCocina()
        {
            InitializeComponent();
        }

        private void CwfCocina_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                this.TsMenu.FormularioID = Convert.ToByte(this.Tag);
                this.TsMenu.LoadPermisos();
                ClearControls();
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);

                this.buscador.CwfSemiTerminadoBusqueda_SeleccionEntidad += new GetObjeto(buscador_CwfSemiTerminadoBusqueda_SeleccionEntidad);
                this.buscador.BorderStyle = BorderStyle.None;
                this.cmbSemiPreparados.DropDownControl = buscador;
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsMenu_EventoNuevo(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            this.cmbSemiPreparados.Enabled = true;
            this.cmbSemiPreparados.Focus();
            this.cocinaBindingSource.AddNew();
        }

        private void TsMenu_EventoEditar(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.cmbSemiPreparados.Enabled = false;
            this.cmbLotes.Focus();
        }

        private void TsMenu_EventoEliminar(object sender, EventArgs e)
        {
            if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
                if (this.cocinaBindingSource.Current != null)
                {
                    LoadCocina(this.cocinaBindingSource.Current as Cocina);
                }
            }
        }

        private void TsMenu_EventoGuardar(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    if (this.cocinaBindingSource.Current != null)
                    {
                        LoadCocina(this.cocinaBindingSource.Current as Cocina);
                    }
                    EnabledControls(true);
                    EnabledButtons(true);
                    this.cocinaDataGridView.Focus();
                }
            }
        }

        private void TsMenu_EventoCancelar(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo)
            {
                ClearControls();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.cocinaBindingSource.CancelEdit();
            this.cocinaDataGridView.Focus();
        }

        private void cocinaDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadCocina(this.cocinaBindingSource.Current as Cocina);
            }
        }

        private void cmbLotes_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadAlmacenes();
        }

        private void buscador_CwfSemiTerminadoBusqueda_SeleccionEntidad(object objeto)
        {
            var insumo = (Insumos)objeto;
            cmbSemiPreparados.Text = insumo.nombre;
            cmbSemiPreparados.Tag = insumo.insumoID.ToString();
            LoadLotes();
            cmbLotes.Focus();
            cmbSemiPreparados.HideDropDown();
            LoadAlmacenes();
        }

        private void cmbSemiPreparados_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down)
                cmbSemiPreparados.ShowDropDown();
            else
                e.SuppressKeyPress = true;
        }

        private void cmbSemiPreparados_DropDown(object sender, EventArgs e)
        {
            buscador.Limpiar();
            cmbSemiPreparados.Text = "[Seleccionar un Semi Terminado]";
        }

        private void cmbSemiPreparados_DropDownClosed(object sender, EventArgs e)
        {

        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                var cocinas = CocinaManager.Instancia.Listar(dtpFecha.Value, cmbEstado.SelectedIndex == 0 ? 'R' : 'A');
                cocinaBindingSource.DataSource = new List<Cocina>(cocinas);
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void cmbAlmacenes_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbLotes.SelectedValue == null || cmbAlmacenes.SelectedValue == null) return;
            var almacenamiento = AlmacenamientosManager.Instancia.Obtener(Convert.ToInt32(cmbLotes.SelectedValue), Convert.ToInt16(cmbAlmacenes.SelectedValue));
            lblStockDestino.Text = almacenamiento.stock.ToString();
        }

        private void InitialLoad()
        {
            try
            {
                var cocinas = CocinaManager.Instancia.Listar(null, 'R');
                cocinaBindingSource.DataSource = new List<Cocina>(cocinas);
                cmbEstado.SelectedIndex = 0;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void LoadMotivos()
        { 
            
        }

        private void LoadCocina(Cocina cocina)
        {
            lblMovimientoID.Text = cocina.cocinaID.ToString();
            lblCodigo.CargarCodigo(MotivoMovimiento.Cocina, cocina.cocinaID);
            cmbSemiPreparados.Text = cocina.NombreInsumo;
            cmbSemiPreparados.Tag = cocina.InsumoID;
            LoadLotes();
            cmbLotes.SelectedValue = cocina.loteID;
            LoadAlmacenes();
            cmbAlmacenes.SelectedValue = cocina.almacenID;
            txtCantidad.Text = cocina.cantidad.ToString();
        }

        private void LoadLotes()
        {
            short insumoID = Convert.ToInt16(cmbSemiPreparados.Tag);
            if (insumoID > 0)
            {
                try
                {
                    cmbLotes.DisplayMember = "Resumen";
                    cmbLotes.ValueMember = "loteID";
                    cmbLotes.DataSource = LotesManager.Instancia.ListarByInsumoID(insumoID);
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
            }
            else
            {
                cmbLotes.DataSource = null;
            }
        }

        private void LoadAlmacenes()
        {
            int loteID = 0;
            if (cmbLotes.SelectedValue != null) Int32.TryParse(cmbLotes.SelectedValue.ToString(), out loteID);
            if (loteID > 0)
            {
                try
                {
                    cmbAlmacenes.DisplayMember = "Almacen_Nombre";
                    cmbAlmacenes.ValueMember = "almacenID";
                    cmbAlmacenes.DataSource = AlmacenamientosManager.Instancia.ListarPorLoteID(loteID);
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
            }
            else
            {
                cmbAlmacenes.DataSource = null;
            }
        }

        private bool SaveData()
        {
            bool result = false;
            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        {
                            var cocina = GetCocina();
                            if (cocina == null) return false;
                            CocinaManager.Instancia.Agregar(cocina);
                        }
                        break;
                    case EstadoActual.Editar:
                        {
                            var cocina = GetCocina();
                            if (cocina == null) return false;
                            CocinaManager.Instancia.Modificar(cocina);
                        }
                        break;
                    case EstadoActual.Eliminar:
                        {
                            CocinaManager.Instancia.Eliminar(GetCocina());
                            this.cocinaBindingSource.RemoveCurrent();
                        }
                        break;
                }

                this.cocinaBindingSource.EndEdit();
                result = true;
                InitialLoad();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        private Cocina GetCocina()
        {
            var semiTerminadoID = Convert.ToInt16(cmbSemiPreparados.Tag);
            var semiTerminado = InsumosManager.Instancia.ObtenerSemiTerminado(semiTerminadoID);
            var cantidad = Convert.ToSingle(txtCantidad.Text);
            var insumos = new List<SemiProductos_Insumos>();

            if (estadoActual == EstadoActual.Nuevo)
            {
                foreach (var insumo in semiTerminado.SemiProductos_Insumos1)
                {
                    var cantidadNecesaria = (cantidad * insumo.cantidad) / semiTerminado.preparacionBasica.Value;

                    if (insumo.stockInsumo < cantidadNecesaria)
                    {
                        Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo,
                            "No hay suficiente " + insumo.nombreInsumo + " para realizar la Preparación.");
                        return null;
                    }
                    else
                    {
                        insumos.Add(new SemiProductos_Insumos
                        {
                            insumoID = insumo.insumoID,
                            cantidad = cantidadNecesaria,
                            nombreInsumo = insumo.nombreInsumo
                        });
                    }
                }
            }
            else if (estadoActual == EstadoActual.Editar)
            {
                foreach (var insumo in semiTerminado.SemiProductos_Insumos1)
                {
                    var cantidadNecesaria = (cantidad * insumo.cantidad) / semiTerminado.preparacionBasica.Value;
                    insumos.Add(new SemiProductos_Insumos
                    {
                        insumoID = insumo.insumoID,
                        cantidad = cantidadNecesaria,
                        nombreInsumo = insumo.nombreInsumo
                    });
                }
            }
            else if (estadoActual == EstadoActual.Eliminar)
            {
                foreach (var insumo in semiTerminado.SemiProductos_Insumos1)
                {
                    var cantidadNecesaria = (cantidad * insumo.cantidad) / semiTerminado.preparacionBasica.Value;
                    insumos.Add(new SemiProductos_Insumos
                    {
                        insumoID = insumo.insumoID,
                        cantidad = cantidadNecesaria,
                        nombreInsumo = insumo.nombreInsumo
                    });
                }
            }

            if (insumos == null) return null;

            var movimiento = new Movimientos
            {
                fecha = DateTime.Now,
                cantidad = Convert.ToDouble(txtCantidad.Text),
                loteID = Convert.ToInt32(cmbLotes.SelectedValue),
                almacenID = Convert.ToInt16(cmbAlmacenes.SelectedValue),
                personalID = DatosGenerales.PersonalActual.personalID,
                motivo = (byte)MotivoMovimiento.Cocina,
                saldo = semiTerminado.stock + Convert.ToDouble(txtCantidad.Text),
                operacionID = Convert.ToInt32(lblMovimientoID.Text)
            };
            var cocina = new Cocina
            {
                fecha = movimiento.fecha,
                cocinaID = Convert.ToInt32(lblMovimientoID.Text),
                cantidad = Convert.ToDouble(txtCantidad.Text),
                loteID = Convert.ToInt32(cmbLotes.SelectedValue),
                almacenID = Convert.ToInt16(cmbAlmacenes.SelectedValue),
                personalID = DatosGenerales.PersonalActual.personalID,
                InsumoID = semiTerminadoID,
                Insumos = insumos,
                Movimiento = movimiento
            };
            return cocina;
        }

        private bool ValidateData()
        {
            bool result = true;

            if (cmbSemiPreparados.Tag == null)
            {
                this.errValidator.SetError(this.cmbSemiPreparados, "Seleccionar un Semi Terminado.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbSemiPreparados, string.Empty);
            }
            if (cmbLotes.SelectedIndex < 0)
            {
                this.errValidator.SetError(this.cmbLotes, "Seleccionar un Lote.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbLotes, string.Empty);
            }
            if (cmbAlmacenes.SelectedIndex < 0)
            {
                this.errValidator.SetError(this.cmbAlmacenes, "Seleccionar un Almacen.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbAlmacenes, string.Empty);
            }
            if (string.IsNullOrEmpty(this.txtCantidad.Text))
            {
                this.errValidator.SetError(this.txtCantidad, "Ingresar Cantidad.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtCantidad, string.Empty);
            }
            return result;
        }

        public void ClearControls()
        {
            foreach (Control ctrl in gbxInformacion.Controls)
            {
                if (ctrl is TextBox)
                    ((TextBox)ctrl).Text = string.Empty;
                if (ctrl is ComboBox)
                    ((ComboBox)ctrl).SelectedIndex = -1;
                if (ctrl is CheckBox)
                    ((CheckBox)ctrl).Checked = false;
                if (ctrl is DateTimePicker)
                    ((DateTimePicker)ctrl).Value = DateTime.Now;
                if (ctrl is MaskedTextBox)
                    ((MaskedTextBox)ctrl).Text = string.Empty;
            }
            lblMovimientoID.Text = "0";
            lblCodigo.CargarCodigo(MotivoMovimiento.Cocina, 0);
            cmbSemiPreparados.Text = "[Seleccionar un Semi Terminado]";
            errValidator.Clear();
        }

        private void EnabledButtons(bool valor)
        {
            this.TsMenu.EnabledNuevo = valor;
            this.TsMenu.EnabledEditar = valor;
            this.TsMenu.EnabledEliminar = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsMenu.EnabledGuardar = true;
                this.TsMenu.EnabledCancelar = true;
                this.cocinaDataGridView.Enabled = false;
            }
            else
            {
                this.TsMenu.EnabledGuardar = false;
                this.TsMenu.EnabledCancelar = false;
                this.cocinaDataGridView.Enabled = true;
            }
        }

        private void EnabledControls(bool valor)
        {
            this.gbxInformacion.Enabled = !valor;
            this.cocinaDataGridView.Enabled = valor;
        }
    }
}
